# Copyright (c) HySoP 2011-2024
#
# This file is part of HySoP software.
# See "https://particle_methods.gricad-pages.univ-grenoble-alpes.fr/hysop-doc/"
# for further info.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from hysop.symbolic.base import SymbolicTensor, SymbolicScalar
from hysop.tools.htypes import check_instance, to_tuple, first_not_None
from hysop.tools.numpywrappers import npw
[docs]
class SymbolicTensorParameter(SymbolicTensor):
def __new__(
cls,
parameter,
name=None,
pretty_name=None,
value=None,
shape=None,
scalar_cls=None,
**kwds,
):
from hysop.parameters.tensor_parameter import TensorParameter
check_instance(parameter, TensorParameter)
value = first_not_None(value, parameter)
shape = first_not_None(shape, parameter.shape)
name = first_not_None(name, parameter.name)
pname = first_not_None(pretty_name, parameter.pretty_name)
scalar_cls = first_not_None(scalar_cls, SymbolicScalarParameter)
scalar_kwds = dict(parameter=parameter)
def make_scalar_kwds(idx):
return dict(view=lambda parameter: parameter._value[idx])
return super().__new__(
cls,
name=name,
pretty_name=pname,
shape=shape,
value=value,
scalar_cls=scalar_cls,
make_scalar_kwds=make_scalar_kwds,
scalar_kwds=scalar_kwds,
**kwds,
)
def __init__(
self,
parameter,
name=None,
pretty_name=None,
value=None,
shape=None,
scalar_cls=None,
**kwds,
):
super().__init__(
name=name,
pretty_name=pretty_name,
shape=shape,
value=value,
scalar_cls=scalar_cls,
make_scalar_kwds=None,
scalar_kwds=None,
**kwds,
)
[docs]
class SymbolicScalarParameter(SymbolicScalar):
def __new__(cls, parameter, name=None, pretty_name=None, value=None, **kwds):
from hysop.parameters.tensor_parameter import TensorParameter
check_instance(parameter, TensorParameter)
value = first_not_None(value, parameter._value)
name = first_not_None(name, parameter.name)
pname = first_not_None(pretty_name, parameter.pretty_name)
obj = super().__new__(cls, name=name, pretty_name=pname, value=value, **kwds)
obj.parameter = parameter
return obj
def __init__(self, parameter, name=None, pretty_name=None, value=None, **kwds):
super().__init__(name=name, pretty_name=pretty_name, value=value, **kwds)
if __name__ == "__main__":
import sympy as sm
from hysop.parameters.tensor_parameter import TensorParameter
from hysop.parameters.scalar_parameter import ScalarParameter
a = ScalarParameter("A", dtype=npw.int32, initial_value=4)
b = TensorParameter("B", shape=(3,), dtype=npw.int32, initial_value=8)
c = TensorParameter("C", shape=(3, 3), dtype=npw.float32, initial_value=12)
A = a.s
B = b.s
C = c.s
D = C.copy()
with D.write_context():
D[0, 0] = B[0]
D[1, 1] = B[1]
D[2, 2] = B[2]
print(A)
print(B)
print(C)
print(D)
print()
print(A.vreplace())
print(B.vreplace())
print(C.vreplace())
print(D.vreplace())
print()
a.set_value(1)
b.set_value(npw.asarray([-1, 0, 1], dtype=b.dtype))
c.set_value(npw.full_like(c.value, 3))
print(A)
print(B)
print(C)
print(D)
print()
print(A.vreplace())
print(B.vreplace())
print(C.vreplace())
print(D.vreplace())
print()